/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.controllers;

import espe.ccsoft.controllers.utils.JsfUtil;
import espe.ccsoft.controllers.utils.PaginationHelper;
import espe.ccsoft.dao.AccionDao;
import espe.ccsoft.dao.PermisoDao;
import espe.ccsoft.models.Accion;
import espe.ccsoft.models.Permiso;
import espe.ccsoft.models.PermisoRol;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

@ManagedBean
@RequestScoped
public class PermisoController {

    private Permiso permiso;
    private DataModel items = null;
    private PaginationHelper pagination;
    private PermisoDao permisoDao;
    private List<Integer> id_roles;
    private PermisoRolController permisorolcontroller;

    public Permiso getSelected() {
        if (permiso == null) {
            permiso = new Permiso();
        }

        return permiso;
    }

    public PermisoDao getPermisoDao() {
        permisoDao = new PermisoDao();
        return permisoDao;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    try {
                        return getPermisoDao().findAll().size();
                    } catch (Exception ex) {
                        return 0;
                    }
                }

                @Override
                public DataModel createPageDataModel() {
                    try {
                        return new ListDataModel(getPermisoDao().findAll());
                    } catch (Exception ex) {
                        return new ListDataModel();
                    }
                }
            };
        }
        return pagination;
    }

    public final String cargarCrearPermiso() {
        permiso = new Permiso();
        return "Crear";
    }

    public final String crearPermiso() throws Exception {

        Permiso permisoTmp = getPermisoDao().findByNombre(permiso.getNombre());
        
        try {
            if (permisoTmp == null) {
                getPermisoDao().insert(permiso);
                insertarAcciones(getPermisoDao().findByNombre(permiso.getNombre()));
                
                JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/PermisosLabels").getString("CrearExito"));
                return "Index";
            } else {
                JsfUtil.addErrorMessage(ResourceBundle.getBundle("/PermisosLabels").getString("ValidarNombre"));
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }

    public final String cargarEditarPermiso() {
        permiso = (Permiso) getItems().getRowData();
        return "Modificar";
    }
    
    public final String cargarEditarDetallePermiso(int id_permiso) throws Exception {
        permiso = getPermisoDao().findByPK(id_permiso);
        return "Modificar";
    }

    public final String cargarDetalleEditarPermiso(int id_permiso) throws Exception {
        permiso = getPermisoDao().findByPK(id_permiso);
        return "Detalle";
    }

    public final String editarPermiso() throws Exception {
        try {
            if (validarEntradasPermiso(permiso)) {
                permisorolcontroller=new PermisoRolController();
                
                getPermisoDao().update(permiso);
                
                permisorolcontroller.elminarPermisos(permiso.getId());
                permisorolcontroller.crearPermisos(id_roles, permiso.getId());
                JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/PermisosLabels").getString("EditarExito"));
                return "Index";
            } else {
                JsfUtil.addErrorMessage(ResourceBundle.getBundle("/PermisosLabels").getString("ValidarNombre"));
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }

    public final boolean validarEntradasPermiso(Permiso permiso) throws Exception {

        Permiso permisoTmp = getPermisoDao().findByNombre(permiso.getNombre());

        if (permisoTmp != null) {
            return permisoTmp.getId() == permiso.getId();
        } else {
            return true;
        }

    }
    
    private void insertarAcciones(Permiso p) throws Exception{
        AccionDao accionDao=new AccionDao();
        
        Accion crear=new Accion();
        crear.setId_permiso(p.getId());
        crear.setNombre("CREAR");
        
        Accion editar=new Accion();
        editar.setId_permiso(p.getId());
        editar.setNombre("EDITAR");
        
        Accion ver=new Accion();
        ver.setId_permiso(p.getId());
        ver.setNombre("VER");
        
        accionDao.insert(crear);
        accionDao.insert(editar);
        accionDao.insert(ver);
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }
    
    public String getNombrePermisoPadre(int id_permiso) throws Exception{
        
        if(getPermisoDao().findByPK(id_permiso)==null)
            return "";
        
        return getPermisoDao().findByPK(id_permiso).getNombre();
    }
    
    public List<Permiso> getPermisosPadre() throws Exception {
        return getPermisoDao().findAllPadre();
    }

    public List<Permiso> getPermisosByUsuarioId(int id_usuario) throws Exception{
        return getPermisoDao().findByUsuario(id_usuario);
    }
    
    public List<Permiso> getPermisosByRolId(int id_rol) throws Exception{
        return getPermisoDao().findByRol(id_rol);
    }
    
    public List<Integer> getId_roles() throws Exception {
        permisorolcontroller=new PermisoRolController();
        
        id_roles=new ArrayList<>();
        for(PermisoRol id_rol:permisorolcontroller.getPermisoDao().findByPermiso(permiso.getId())){
            id_roles.add(id_rol.getPermiso_rol().getId_rol());
        }
        
        return id_roles;
    }

    public void setId_roles(List<Integer> id_roles) {
        this.id_roles = id_roles;
    }
    
}
